from typing import Union
from typing import Optional
from fastapi import FastAPI
from fastapi import *
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel

import nmap





app = FastAPI(
    title='my_nmap',
    description='nmap gui server',
    version='0.0.1'
)

app.add_middleware(
    CORSMiddleware,
    # 允许跨域的源列表，例如 ["http://www.example.org"] 等等，["*"] 表示允许任何源
    allow_origins=["*"],
    # 跨域请求是否支持 cookie，默认是 False，如果为 True，allow_origins 必须为具体的源，不可以是 ["*"]
    allow_credentials=False,
    # 允许跨域请求的 HTTP 方法列表，默认是 ["GET"]
    allow_methods=["*"],
    # 允许跨域请求的 HTTP 请求头列表，默认是 []，可以使用 ["*"] 表示允许所有的请求头
    # 当然 Accept、Accept-Language、Content-Language 以及 Content-Type 总之被允许的
    allow_headers=["*"],
    # 可以被浏览器访问的响应头, 默认是 []，一般很少指定
    # expose_headers=["*"]
    # 设定浏览器缓存 CORS 响应的最长时间，单位是秒。默认为 600，一般也很少指定
    # max_age=1000
)







# 创建数据模型
class Item(BaseModel):
    ip: str=None
    port: str=None
    param: str="-sS"

@app.post('/normalsearch/tcp')
async def normal_tcp(
        item: Item

):
    """
    post请求中 Body 用来传递参数
    ip:需要查找的ip地址
    """
    nm = nmap.PortScanner()
    myscan = nm.scan(item.ip, None, '-sS')
    return myscan


@app.get("/test")
def read_root():
    nm = nmap.PortScanner()
    myscan = nm.scan("116.63.138.59", "22", "-A")
    return myscan


@app.post('/advsearch')
async def test_post(
        item: Item

):
    """
    post请求中 Body 用来传递参数
    ip:需要查找的ip地址 长度限制30
    port:需要查找端口号 长度限制12
    param:参数 长度限制1000
    """
    nm = nmap.PortScanner()
    myscan = nm.scan(item.ip, item.port,item.param)
    return myscan
